package com.nova.android.tvlauncher.download

import kotlinx.coroutines.flow.update
import java.io.File

/**
 * 用于标记应用下载和安装任务状态的工具类。
 * 该类封装了对 AppDownloader.tasks 和 installJobs 的操作。
 */
object AppTaskMarker {

    // 获取当前的任务映射表（businessId -> StateFlow<AppTask>）
    private val tasks get() = AppDownloader.tasks

    // 获取当前的安装协程 Job 映射表（businessId -> Job）
    private val installJobs get() = AppDownloader.installJobs

    /**
     * 将任务标记为等待中（PENDING）状态。
     * 会清除文件、取消并移除安装任务。
     * @param item 当前的 AppTask 实例。
     * @param pendingStatus 可选的挂起状态值，默认为 0。
     * (pendingStatus=0默认等待状态，pendingStatus=1下载失败状态，pendingStatus=2安装失败状态)
     */
    fun markPending(item: AppTask, pendingStatus: Int = 0) {
        val businessId = item.businessId
        val filePath = item.filePath
        tasks[businessId]?.update {
            it.copy(status = AppTaskStatus.PENDING, progress = 0f, pendingStatus = pendingStatus)
        }
        File(filePath).delete() // 删除对应的下载文件
        installJobs[businessId]?.cancel() // 取消安装任务
        installJobs.remove(businessId) // 移除安装任务记录
    }

    /**
     * 将任务标记为正在下载状态（DOWNLOADING）。
     * @param businessId 当前任务的唯一标识。
     * @param progress 下载进度，默认为 0f。
     */
    fun markDownloading(businessId: String, progress: Float = 0f) {
        tasks[businessId]?.update {
            it.copy(status = AppTaskStatus.DOWNLOADING, progress = progress)
        }
    }

    /**
     * 将任务标记为下载完成（DOWNLOAD_COMPLETED）状态。
     * 进度强制设置为 100%。
     * @param businessId 当前任务的唯一标识。
     */
    fun markDownloadCompleted(businessId: String) {
        tasks[businessId]?.update {
            it.copy(status = AppTaskStatus.DOWNLOAD_COMPLETED, progress = 100f)
        }
    }

    /**
     * 将任务标记为正在安装（INSTALLING）状态。
     * @param businessId 当前任务的唯一标识。
     */
    fun markInstalling(businessId: String) {
        tasks[businessId]?.update {
            it.copy(status = AppTaskStatus.INSTALLING)
        }
    }

    /**
     * 将任务标记为安装完成（INSTALLED）状态。
     * 同时清除下载文件，取消并移除安装任务。
     * @param item 当前的 AppTask 实例。
     * @param pendingStatus 可选的挂起状态值，默认为 0。
     * (pendingStatus=0默认安装成功状态，pendingStatus=1取消卸载状态，pendingStatus=2卸载失败状态)
     */
    fun markInstalled(item: AppTask, pendingStatus: Int = 0) {
        val businessId = item.businessId
        val filePath = item.filePath
        tasks[businessId]?.update {
            it.copy(status = AppTaskStatus.INSTALLED, pendingStatus = pendingStatus)
        }
        File(filePath).delete() // 安装后删除下载文件
        installJobs[businessId]?.cancel() // 取消安装任务
        installJobs.remove(businessId) // 移除任务记录
    }

    /**
     * 将任务标记为正在卸载（UNINSTALLING）状态。
     * 卸载时也会清除任务记录。
     * @param businessId 当前任务的唯一标识。
     */
    fun markUninstalling(businessId: String) {
        tasks[businessId]?.update {
            it.copy(status = AppTaskStatus.UNINSTALLING, progress = 0f)
        }
        installJobs[businessId]?.cancel() // 取消可能存在的任务
        installJobs.remove(businessId)
    }
}
